home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / progs / sviluppo / pike-0.4.0 / lib / include / stdio.pre.pike < prev    next >
Text File  |  1997-01-10  |  4KB  |  223 lines

  1. #include <string.h>
  2. object stderr=File("stderr");
  3. #define error(X) throw( ({ (X), backtrace()[0..sizeof(backtrace())-2] }) )
  4. program FILE = class {
  5.  
  6. #define BUFSIZE 16384
  7.     inherit "/precompiled/file";
  8.  
  9.     /* Private functions / buffers etc. */
  10.  
  11.     private string b="";
  12.     private int bpos=0;
  13.  
  14.     inline private static nomask int get_data()
  15.     {
  16.       string s;
  17.       b = b[bpos .. ];
  18.       bpos=0;
  19.       s = file::read(BUFSIZE,1);
  20.       if(!s || !strlen(s))
  21.     return 0;
  22.       b += s;
  23.       return 1;
  24.     }
  25.  
  26.     inline private static nomask string extract(int bytes, int|void skip)
  27.     {
  28.       string s;
  29.       s=b[bpos..bpos+bytes-1];
  30.       bpos += bytes+skip;
  31.       return s;
  32.     }
  33.  
  34.  
  35.     /* Public functions. */
  36.     string gets()
  37.     {
  38.       int p;
  39.       while((p=search(b, "\n", bpos)) == -1)
  40.     if(!get_data())
  41.       return 0;
  42.       return extract(p-bpos, 1);
  43.     }
  44.  
  45.     int seek(int pos)
  46.     {
  47.       bpos=0;
  48.       b="";
  49.       return file::seek(pos);
  50.     }
  51.  
  52.     int close(void|string mode)
  53.     {
  54.       bpos=0;
  55.       b="";
  56.       if(!mode) mode="rw";
  57.       file::close(mode);
  58.     }
  59.  
  60.     int open(string file, void|string mode)
  61.     {
  62.       bpos=0;
  63.       b="";
  64.       if(!mode) mode="rwc";
  65.       return file::open(file,mode);
  66.     }
  67.  
  68.     int open_socket()
  69.     {
  70.       bpos=0;
  71.       b="";
  72.       return file::open_socket();
  73.     }
  74.  
  75.     object pipe()
  76.     {
  77.       bpos=0;
  78.       b="";
  79.       return file::pipe();
  80.     }
  81.  
  82.     object dup()
  83.     {
  84.       object o;
  85.       o=object_program(this_object())();
  86.       o->assign(file::dup());
  87.       return o;
  88.     }
  89.  
  90.     void set_nonblocking()
  91.     {
  92.       error("Cannot use nonblocking IO with buffered files.\n");
  93.     }
  94.  
  95.     int printf(string fmt, mixed ... data)
  96.     {
  97.       if(!sizeof(data))
  98.     return file::write(fmt);
  99.       else
  100.     return file::write(sprintf(fmt,@data));
  101.     }
  102.     
  103.     string read(int bytes)
  104.     {
  105.       while(strlen(b) - bpos < bytes)
  106.     if(!get_data())
  107.       break;
  108.  
  109.       return extract(bytes);
  110.     }
  111.  
  112.     string ungets(string s)
  113.     {
  114.       b=s+b[bpos..];
  115.       bpos=0;
  116.     }
  117.  
  118.     int getchar()
  119.     {
  120.       if(strlen(b) - bpos < 1)
  121.     if(!get_data())
  122.       return -1;
  123.  
  124.       return b[bpos++];
  125.     }
  126.   };
  127.  
  128. inherit "/precompiled/file";
  129.  
  130. string read_file(string filename,void|int start,void|int len)
  131. {
  132.   object buf,f;
  133.   string ret,tmp;
  134.   f=FILE();
  135.   if(!f->open(filename,"r")) return 0;
  136.  
  137.   switch(query_num_arg())
  138.   {
  139.   case 1:
  140.     ret=f->read(0x7fffffff);
  141.     break;
  142.  
  143.   case 2:
  144.     len=0x7fffffff;
  145.   case 3:
  146.     while(start-- && f->gets());
  147.     buf=String_buffer();
  148.     while(len-- && (tmp=f->gets()))
  149.     {
  150.       buf->append(tmp);
  151.       buf->append("\n");
  152.     }
  153.     ret=buf->get_buffer();
  154.     destruct(buf);
  155.   }
  156.   destruct(f);
  157.  
  158.   return ret;
  159. }
  160.  
  161. string read_bytes(string filename,void|int start,void|int len)
  162. {
  163.   string ret;
  164.   if(!open(filename,"r"))
  165.     return 0;
  166.   
  167.   switch(query_num_arg())
  168.   {
  169.   case 1:
  170.   case 2:
  171.     len=0x7fffffff;
  172.   case 3:
  173.     seek(start);
  174.   }
  175.   ret=read(len);
  176.   close();
  177.   return ret;
  178. }
  179.  
  180. int write_file(string filename,string what)
  181. {
  182.   int ret;
  183.   if(!open(filename,"awc"))
  184.     error("Couldn't open file "+filename+".\n");
  185.   
  186.   ret=write(what);
  187.   close();
  188.   return ret;
  189. }
  190.  
  191. int file_size(string s)
  192. {
  193.   int *stat;
  194.   stat=file_stat(s);
  195.   if(!stat) return -1;
  196.   return stat[1]; 
  197. }
  198.  
  199. void perror(string s)
  200. {
  201. #if efun(strerror)
  202.   stderr->write(s+": "+strerror(predef::errno())+"\n");
  203. #else
  204.   stderr->write(s+": errno: "+predef::errno()+"\n");
  205. #endif
  206. }
  207.  
  208. void create()
  209. {
  210.   add_constant("file_size",file_size);
  211.   add_constant("write_file",write_file);
  212.   add_constant("read_bytes",read_bytes);
  213.   add_constant("read_file",read_file);
  214.   add_constant("perror",perror);
  215.  
  216.  
  217.   master()->add_precompiled_program("/precompiled/FILE", FILE);
  218.  
  219.   add_constant("stdin",FILE("stdin"));
  220.   add_constant("stdout",File("stdout"));
  221.   add_constant("stderr",stderr);
  222. }
  223.